
#ifndef THREAD_H
#define THREAD_H

#include <pthread.h>

	    

class Thread{
public:
	// Constructor queda a criterio de las subclases.
	Thread();
	// Lanza el thread
	virtual void run();
	// Pide al thread que finalice sus tareas lo antes posible
	virtual void stop();

	bool getSeguirCorriendo(){return seguirCorriendo;}
	void noSeguirCorriendo(){seguirCorriendo=false;}
	
	// Indica si el thread esta corriendo o no
	virtual bool isAlive() const;
	// Espera a que el thread termine realmente
	virtual void join();
	// Espera que el Thread termine y lo libera
	virtual ~Thread();
	// Duerme el thread actual una cierta cantidad de milisegundos
	static void sleep(unsigned long msecs);

protected:
	// Metodo virtual puro que deben implementar las subclases
	virtual void main() = 0;

private:
	bool isrun;
	bool seguirCorriendo;
	pthread_t thread;

	// Metodo estatico (funcion plana) que realmente ejecuta el thread
	// (tomara el puntero this como argumento siempre).
	static void* static_run(void* arg);
	// Constructor de copia y operator= ocultos (para prevenir descuidos)
	Thread(const Thread&);
	Thread& operator=(const Thread&);
};

#endif
